# 导包
import pymysql
import re


def connect():
    # 创建连接
    con = pymysql.connect(
        host="master",
        port=3306,
        user="root",
        password="123456",
        database="shujia"
    )
    return con


# 创建表
def create_user(con):
    # 创建保存用户信息表
    user_ddl = """
    create table if not exists users(
      `id` INT UNSIGNED AUTO_INCREMENT,
      `name` varchar(255) not null,
      `phone` varchar(11) not null,
      `addr` varchar(255) ,
      `email` varchar(255) ,
      `passwd` varchar(255) not null ,
       PRIMARY KEY ( `id` )
    )
    """
    # 获取游标
    cursor = con.cursor()

    # 执行sql
    cursor.execute(user_ddl)


# 注册
def register(con):
    print("=========================用户注册==============================")
    # 用户名
    username = input("请输出用户名：")

    # 手机号
    phone = input("请输入手机号：")

    # 密码
    passwd = input("请输入密码：")

    if len(phone) != 11:
        print("手机号格式不正确：")
        print("请重新输入")
        # 重新注册
        register(con)
        return

    # 使用正则判断手机格式
    search = re.search("[^0-9]", phone)
    if search is not None:
        print("手机号格式不正确：")
        print("请重新输入")
        # 重新注册
        register(con)
        return

    # 获取游标
    cursor = con.cursor()

    # 哦按段用户名和手机号是否存在，如果存在返回注册失败
    flog = cursor.execute(f"select id from users where name=%s", [username])

    if flog != 0:
        print("用户名已存在")
        # 返回
        print("请重新输入")
        # 重新注册
        register(con)
        return

    # 哦按段用户名和手机号是否存在，如果存在返回注册失败
    flog = cursor.execute(f"select id from users where phone=%s", [phone])

    if flog != 0:
        print("手机已存在")
        # 返回
        print("请重新输入")
        # 重新注册
        register(con)
        return

        # 拼接sql
    insert_sql = f"insert into users(name,phone,passwd) values(%s,%s,md5(%s))"

    # 执行sql
    flog = cursor.execute(insert_sql, [username, phone, passwd])
    if flog == 1:
        con.commit()
        print("注册成功")
    else:
        con.rollback()
        print("注册失败")


# 登录
def login(con):
    print("=========================用户登录==============================")

    # 用户名
    username = input("请输入用户名：")
    # 密码
    passwd = input("请输入密码：")

    cursor = con.cursor()
    # 验证用户名是否存在
    flog = cursor.execute(f"select * from users where name=%s", [username])

    if flog == 0:
        print("用户名输入不正确")
        print("请重新输入")
        login(con)
        return

    # sql注入，传入一条特殊的参数，改变原来sql的结构，绕过验证比如用户名（ or 1=1 or 1='）

    # 判断用户名和密码是否正确
    dql_sql = f"select * from users where name=%s and passwd=md5(%s)"
    print(dql_sql)
    flog = cursor.execute(dql_sql, [username, passwd])
    if flog == 0:
        print("密码输入不正确")
        print("请重新输入")
        login(con)
        return

    if flog != 0:
        print("登录成功")


# 修改密码
def modify_passwd(con):
    print("========================修改密码===============================")
    username = input("请输入用户名：")
    # 原密码
    now_passwd = input("请输入原密码：")
    # 新密码
    new_passwd = input("请输入新密码：")

    cursor = con.cursor()
    # 验证原用户名密码是否正确
    flog = cursor.execute("select * from users where name=%s and passwd=md5(%s)", [username, now_passwd])

    if flog == 0:
        print("用户名密码输入不正确")
        print("请重新输入")
        modify_passwd(con)
        return

    # 修改密码
    execute = cursor.execute("update users set passwd=md5(%s) where name=%s", [new_passwd, username])

    if execute != 0:
        print("修改成功")
        # 提交事务
        con.commit()


if __name__ == '__main__':
    # 创建数据库连接
    con = connect()

    # 创建表
    create_user(con)

    print("==============登录输入1，注册输入2，修改密码3=============================")
    num = input("请选择")

    if num == "1":
        # 登录
        login(con)
    elif num == "2":
        # 注册
        register(con)
    elif num == "3":
        modify_passwd(con)

    # 关闭连接
    con.close()
